# 习题
# 1、如何判断一个对象是可迭代对象，迭代器对象或生成器
# 如果一个对象拥有__iter__方法，其是可迭代对象；如果一个对象拥有next方法，其是迭代器。
# 定义可迭代对象，必须实现__iter__方法；定义迭代器，必须实现__iter__和next方法

# 2、迭代器与生成器的区别
# 生成器是只能遍历一次的。
# 生成器是一类特殊的迭代器。
# 迭代器是一个更抽象的概念，任何对象，如果它的类有 next 方法和 iter 方法返回自己本身，对于 string、list、
# dict、tuple 等这类容器对象，使用 for 循环遍历是很方便的。在后台 for 语句对容器对象调用 iter()函数，iter()
# 是 python 的内置函数。iter()会返回一个定义了 next()方法的迭代器对象，它在容器中逐个访问容器内元素，next()
# 也是 python 的内置函数。在没有后续元素时，next()会抛出一个 StopIteration 异常。
#
#
# 生成器（Generator）是创建迭代器的简单而强大的工具。它们写起来就像是正规的函数，只是在需要返回数
# 据的时候使用 yield 语句。每次 next()被调用时，生成器会返回它脱离的位置（它记忆语句最后一次执行的位置
# 和所有的数据值）
#
#
# 区别：生成器能做到迭代器能做的所有事,而且因为自动创建了 iter()和 next()方法,生成器显得特别简洁,而且
# 生成器也是高效的，使用生成器表达式取代列表解析可以同时节省内存。除了创建和保存程序状态的自动方法,当
# 发生器终结时,还会自动抛出 StopIteration 异常。


# 3、可迭代对象与迭代器的区别
# 迭代，是重复反馈过程的活动，通常是为了逼近所需目标或结果。每对过程重复一次称为一次“迭代”，而每次迭代得到的结果会作为下一次迭代的初始值。
# 在 Python 中，迭代是访问集合型数据的一种方式，对于字符串、列表、元组、集合和字典，都可以使用迭代来遍历其中的每个元素，
# 而这些可以使用 for 循环遍历的对象也被称为可迭代对象。
# 迭代器是将一个可迭代对象添加了迭代遍历特性后变换而成的对象
# 迭代器有以下特点：
# 从集合的第一个元素开始访问，直到所有的元素被访问完结束；
# 可以记住遍历的位置；
# 只能向前不能后退。
# 可迭代对象不一定是迭代器，但迭代器一定是可迭代对象
# 可以使用 isinstance( ) 函数检查一个对象是迭代器还是可迭代对象


# 4、如何定义一个生成器
# 在Python中，一边循环一边计算的机制，称为生成器：generator。
# 第一种方法很简单，只要把一个列表生成式的[]改成()，就创建了一个generator
# 第二种如果一个函数中包含yield关键字，那么这个函数就不再是一个普通函数，而是一个generator。
# 调用函数就是创建了一个生成器（generator）对象。

# 5、如何获取可迭代对象，迭代器与生成器中的数据
# 可迭代对象 直接用for循环  迭代器 调用next方法  生成器有 yield 关键字，调用生成器函数时，就会返回一个生成器对象。


# import string
# import random
# with open("tx.txt",'w+',encoding="utf-8")as f:
#     for i in range(10):
#         f.write(("".join(random.choices(string.ascii_lowercase,k=random.randint(1,50)))+"\n"))
# def read_file(path):
#     with open (path,"r+") as f:
#      while f.readline():
#        line1=f.readline()
#        l=len(line1)
#        if l>0:
#            yield line1
# f=read_file("tx.txt")
# lst1=list(f)
# length = len(lst1)
# print (lst1,sorted(lst1))


# import string
# import  random
# with open("big.txt","w+",encoding="utf-8") as f:
#     for i in range(1000):
#         # f.write('aaaaaaaaaaaaaaa\n')
#         f.write(("".join(random.choices(string.ascii_lowercase,k=random.randint(1,50)))+"\n"))
#
#
# def read_file(path):
#     SIZE = 50000
#     with open(path,"rb") as f:
#         while True:
#             block = f.read(SIZE)
#             if block:
#                 yield block
#             else:
#                 return
#
# g = read_file("big.txt")
# j = [0]
# for i in g:
#      if len(i) >= j[0]:
#          j.remove(j[0])
#          j.append(len(i))
#      else:
#          continue
# print(f"字符长度最长的长度为:{j[0]}")
